#include <functional>
#include <iostream>
#include <thread>

/*
c++11 std::bind 的使用 与std::function 搭配使用
用于绑定函数对象，其返回的结果仍然是函数对象，可以用于绑定部分或全部参数
*/

void foo(const std::string& str) {
    std::cout << str << std::endl;
}
int sum(int a, int b) {
    return a + b;
}
class Foo {
public:
    int bar(int a, int b, int c) {
        return a * b + c;
    }
};

int main() {
    // bind是函数模板 可以自动推演 模板类型参数
    auto func1 = std::bind(foo, "hello, std::bind");
    auto func2 = std::bind(sum, 1, 2);
    auto func3 = std::bind(sum, 1, std::placeholders::_1);
    auto func4 = std::bind(sum, std::placeholders::_1, 2);
    auto func5 = std::bind(sum, std::placeholders::_1, std::placeholders::_2);

    auto func6 = std::bind(&Foo::bar, Foo(), std::placeholders::_1,
                           std::placeholders::_2, std::placeholders::_3);

    func1();
    std::cout << func2() << std::endl;
    std::cout << func3(2) << std::endl;
    std::cout << func4(1) << std::endl;
    std::cout << func5(1, 2) << std::endl;
    std::cout << func6(1, 2, 3) << std::endl;
    return 0;
}
